﻿using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.Office.Server;
using Microsoft.Office.Server.UserProfiles;
using Square.Activity;
using System.Text;

namespace Square.CONTROLTEMPLATES.Square
{
    public partial class addGroup : UserControl
    {
        #region ## Properties
        public string _siteUrl { get { return SPContext.Current.Site.Url; } }
        public string _webUrl { get { return SPContext.Current.Web.Url; } }
        private string _listUrl { get { return "/my/Lists/Sq_Colleagues"; } }
        private string _listName { get { return "Sq_Colleagues"; } }

        public string _accountName
        {
            get
            {
                if (Request.QueryString["accountname"] != null)
                    return Request.QueryString["accountname"];
                else
                    return this.Page.User.Identity.Name;
                //return hd_accountName.Value;
            }
        }

        public UserProfile _pageUserProfile;
        public UserProfile _colleagueProfile;
        SquareActivityHelper sHelper;
        
        private bool _EditId { get; set; }
        #endregion


        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["LinkID"] != null && !string.IsNullOrEmpty(Request.QueryString["LinkID"]))
                _EditId = true;
        }

        public void lbtn_OK_Click(object sender, EventArgs e)
        {
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite _site = new SPSite(_siteUrl))
                    {
                        using (SPWeb _web = _site.OpenWeb())
                        {
                            SPServiceContext context = SPServiceContext.GetContext(_site);
                            UserProfileManager upm = new UserProfileManager(context);

                            if (upm.UserExists(_accountName))
                            {
                                _pageUserProfile = upm.GetUserProfile(_accountName);

                                if (_pageUserProfile != null)
                                {
                                    SPList _list = _web.GetList(_listUrl);
                                    //SPList _list = _web.Lists[_listName];

                                    if (!_EditId)
                                    {
                                        string[] _LinkID = hd_ColleaguesID.Value.Split(',');
                                        // 기존에 다른 그룹에 등록이 되어 있는 동료 인지 확인한다.

                                        foreach (string _id in _LinkID)
                                        {
                                            // DB 저장
                                            db_Save(_id);

                                            _colleagueProfile = upm.GetUserProfile(_id);
                                            bool chkGroup = false;

                                            // 각 아이템의 정보를 받아서 업데이트 한다.
                                            SPListItem _item = _list.Items.Add();
                                            if (chkGroup) _item["Title"] = "";              // DB에 저장되는 Id --- DB에는 중복 저장이 되지 않아 없을 수도 있다. 
                                            else _item["Title"] = "" + "_" + DateTime.Now.ToString("yyyyMMddhhmmss");  // 없을 경우는 기존 DB에 저장되어 있는 Id_yyyyMMddhhmmss
                                            _item["RecordId"] = _pageUserProfile.RecordId;  // 현재 페이지의 사용자 RecordId
                                            _item["ColleagueRecordId"] = _colleagueProfile.RecordId;                // 동료로 추가되는 RecordId
                                            if (hd_IsGroup.Value == "N")                    // DB에 저장되는 GroupType - 현재 사용되지는 않는다.
                                                _item["GroupType"] = "1";
                                            else
                                                _item["GroupType"] = "0";
                                            _item["GroupTitle"] = string.IsNullOrEmpty(hd_GroupTitle.Value) ? "General" : hd_GroupTitle.Value;      // 선택 박스에서 선택한 그룹 또는 새로 생성된 그룹
                                            _item["IsWorkgroup"] = hd_IsTeam.Value;         // 팀 선택 여부 Y / N
                                            _item["ItemSecurity"] = hd_GroupLevel.Value;    // 공개 설정 여부 1(모두공개) / 2(내동료) / 4(팀공개) / 8(내관리자) / 16(비공개)
                                            _item["PartitionID"] = _pageUserProfile.ID;     // SharePoint에서 지정한 PartitionID - 아직 사용되지 않는다.
                                            _item["IsEnable"] = "N";                        // 동료 요청 수락 여부 Y / N - 신규 생성 시 N
                                            _item["IsColleagues"] = hd_IsTeam.Value;        // 팀 그룹 여부 Y / N

                                            _item.Update();



                                            //has been added guest to the room
                                            bool bSave = false;
                                            SquareActivities aType = new SquareActivities();
                                            aType = SquareActivities.SquarePeopleGroupAddPeople;

                                            sHelper = new SquareActivityHelper();
                                            string[] rName = _colleagueProfile.DisplayName.Split(',');
                                            
                                            //bSave = sHelper.SaveActivity(this.Page, aType, rName  + "님의 요청을 수락하습니다.");
                                            bSave = sHelper.SaveActivity(this.Page, aType, " has been added " + _colleagueProfile.DisplayName); // + " to the " + (string.IsNullOrEmpty(hd_GroupTitle.Value) ? "General" : hd_GroupTitle.Value));
                                            bSave = sHelper.SaveActivity(this.Page, aType, " has accepted " + "<a href=\"" + _colleagueProfile.PersonalUrl + "\" target=\"_blank\">" + rName[1] + "</a>" + "'s request.");
                                        }
                                    }
                                    else
                                    {
                                        string[] _LinkID = Request.QueryString["LinkID"].Split(',');
                                        foreach (string _id in _LinkID)
                                        {
                                            if (!string.IsNullOrEmpty(_id))
                                            {
                                                SPListItem _item = SelectItem(_id, _list);


                                                if (hd_IsGroup.Value == "N")                    // DB에 저장되는 GroupType - 현재 사용되지는 않는다.
                                                    _item["GroupType"] = "1";
                                                else
                                                    _item["GroupType"] = "0";
                                                _item["GroupTitle"] = string.IsNullOrEmpty(hd_GroupTitle.Value) ? "General" : hd_GroupTitle.Value;      // 선택 박스에서 선택한 그룹 또는 새로 생성된 그룹
                                                _item["IsWorkgroup"] = hd_IsTeam.Value;         // 팀 선택 여부 Y / N
                                                _item["ItemSecurity"] = hd_GroupLevel.Value;    // 공개 설정 여부 1(모두공개) / 2(내동료) / 4(팀공개) / 8(내관리자) / 16(비공개)
                                                _item["IsColleagues"] = hd_IsTeam.Value;        // 팀 그룹 여부 Y / N

                                                _item.Update();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                });
            }
            catch (Exception ex) { throw new Exception(ex.ToString()); }
        }

        #region ## 동료의 기본 정보를 DB에 저장
        public void db_Save(string _id)
        {
            //Open SPSite
            using (SPSite _site = new SPSite(_siteUrl))
            {
                //Get Server context
                //SPServiceContext
                SPServiceContext context = SPServiceContext.GetContext(_site);
                //ServerContext context = ServerContext.GetContext(_site);
                //Get UserProfileManager for the site cocntext
                UserProfileManager profileManager = new UserProfileManager(context);
                UserProfile userProfile;
                if (profileManager.UserExists(_accountName))
                {
                    userProfile = profileManager.GetUserProfile(_accountName);

                    //Check whether the colleague profile exists or not
                    if (profileManager.UserExists(_id))
                    {
                        ColleagueManager colleagueManager;
                        UserProfile colleagueProfile;
                        colleagueProfile = profileManager.GetUserProfile(_id);
                        colleagueManager = userProfile.Colleagues;
                        //Adds collegue with group type peer. This property is marked as public
                        colleagueManager.Create(colleagueProfile, ColleagueGroupType.General, "", false, Privacy.Public);
                    }
                }
            }
        }
        #endregion

        #region ## 선택 아이템 찾기
        public SPListItem SelectItem(string Title, SPList _list)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("<OrderBy>");
            sb.Append("<FieldRef Name=\"Created\" Ascending=\"False\" />");
            sb.Append("</OrderBy>");
            sb.Append("<Where>");
            sb.Append("     <Eq>");
            sb.Append("         <FieldRef Name=\"Title\" />");
            sb.AppendFormat("   <Value Type=\"Text\">{0}</Value>", Title);
            sb.Append("     </Eq>");
            sb.Append("</Where>");

            SPQuery sq = new SPQuery();
            sq.ViewFields = SPQueryViewFields();
            sq.Query = sb.ToString();
            SPListItemCollection _items = _list.GetItems(sq);

            return _items[0];
        }
        #endregion

        #region ## SPQueryViewFields
        public string SPQueryViewFields()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("<FieldRef Name=\"Title\" />");
            sb.Append("<FieldRef Name=\"RecordId\" />");
            sb.Append("<FieldRef Name=\"ColleagueRecordId\" />");
            sb.Append("<FieldRef Name=\"IsEnable\" />");
            sb.Append("<FieldRef Name=\"GroupTitle\" />");
            sb.Append("<FieldRef Name=\"GroupType\" />");
            sb.Append("<FieldRef Name=\"IsWorkgroup\" />");
            sb.Append("<FieldRef Name=\"ItemSecurity\" />");
            sb.Append("<FieldRef Name=\"ItemSecurity\" />");
            sb.Append("<FieldRef Name=\"Created\" />");
            return sb.ToString();
        }
        #endregion

        #region ## 해당 동료 가입 여부 확인
        public bool ColleaguesYN(UserProfile pageUserProfile, UserProfile colleagueProfile, SPList _list)
        {
            bool chk = false;
            StringBuilder sb = new StringBuilder();
            sb.Append("<OrderBy>");
            sb.Append("<FieldRef Name=\"Created\" Ascending=\"False\" />");
            sb.Append("</OrderBy>");
            sb.Append("<Where>");
            sb.Append(" <And>");
            sb.Append("     <Eq>");
            sb.Append("         <FieldRef Name=\"RecordId\" />");
            sb.AppendFormat("   <Value Type=\"Text\">{0}</Value>", pageUserProfile.RecordId);
            sb.Append("     </Eq>");
            sb.Append("     <Eq>");
            sb.Append("         <FieldRef Name=\"ColleagueRecordId\" />");
            sb.AppendFormat("   <Value Type=\"Text\">{0}</Value>", colleagueProfile.RecordId);
            sb.Append("     </Eq>");
            sb.Append(" </And>");
            sb.Append("</Where>");

            SPQuery sq = new SPQuery();
            sq.ViewFields = SPQueryViewFields();
            sq.Query = sb.ToString();
            SPListItemCollection _items = _list.GetItems(sq);
            if (_items.Count <= 0) chk = true;
            return chk;
        }
        #endregion
    }
}
